//这里调通了X11和BGFX的配合，但是碰到了奇怪的问题，怀疑是BGFX的多窗口实现有问题，暂时没有解决路径
//暂时在sdl2的路径上面继续

// #include "winmgr.h"

// // #include <SDL2/SDL.h>
// // #include <SDL2/SDL_syswm.h>
// #include "bgfx/bgfx.h"
// #include "bgfx/platform.h"

// #include "bgfx_imgui.h"

// #include <X11/Xlib.h>
// #include <X11/Xutil.h>
// #include <X11/Xos.h>
// #include <X11/Xatom.h>
// #include <bx/thread.h>
// #include <bx/os.h>
// #include <bx/handlealloc.h>
// #include <bx/mutex.h>
// winmgr::winmgr()
// {
// }
// winmgr *winmgr::g_this = nullptr;

// winmgr *winmgr::Instance()
// {
//     if (winmgr::g_this == nullptr)
//         winmgr::g_this = new winmgr();
//     return winmgr::g_this;
// }
// uint64_t X11CreateWindow(Display *display, const char *title, int width, int height, bool showinTask)
// {
//     int screennum = DefaultScreen(display);
//     if (height <= 0)
//         height = DisplayHeight(display, screennum) / 4;
//     if (width <= 0)
//         width = DisplayWidth(display, screennum) / 4;
//     int32_t screen = DefaultScreen(display);
//     auto depth = DefaultDepth(display, screen);
//     auto visual = DefaultVisual(display, screen);
//     auto root = RootWindow(display, screen);

//     XSetWindowAttributes windowAttrs;
//     bx::memSet(&windowAttrs, 0, sizeof(windowAttrs));
//     windowAttrs.background_pixel = 0;
//     windowAttrs.border_pixel = 0;
//     windowAttrs.bit_gravity = StaticGravity;
//     windowAttrs.event_mask = 0 | ButtonPressMask | ButtonReleaseMask | ExposureMask | KeyPressMask | KeyReleaseMask | PointerMotionMask | StructureNotifyMask;

//     auto win = XCreateWindow(display,
//                              RootWindow(display, screennum),
//                              0, 0, width, height, 3,
//                              depth,
//                              InputOutput,
//                              visual,
//                              CWBorderPixel | CWEventMask | CWBackPixel | CWBitGravity,
//                              &windowAttrs);

//     //窗口接受的事件可以后改
//     XSelectInput(display, win,
//                  ExposureMask | KeyPressMask | ButtonPressMask | StructureNotifyMask | ButtonReleaseMask | KeyReleaseMask | PointerMotionMask);
//     // //这句话是万恶之源
//     // //   XSelectInput(display, win,
//     // //                  ExposureMask | KeyPressMask | ButtonPressMask | StructureNotifyMask |
//     // //                    ResizeRedirectMask);//ResizeRedirectMask 这个不能加

//     //这个可以关闭自动退出事件
//     const char *wmDeleteWindowName = "WM_DELETE_WINDOW";
//     Atom wmDeleteWindow;
//     XInternAtoms(display, (char **)&wmDeleteWindowName, 1, False, &wmDeleteWindow);
//     XSetWMProtocols(display, win, &wmDeleteWindow, 1);

//     //设置窗口标题
//     XStoreName(display, win, title);
//     XSetIconName(display, win, title);
//     //这个一设置就有任务栏图标了
//     if (showinTask)
//     {
//         XClassHint *hint = XAllocClassHint();
//         hint->res_name = (char *)title;
//         hint->res_class = (char *)title;
//         XSetClassHint(display, win, hint);
//         XFree(hint);
//     }
//     return win;
// }
// void winmgr::MainLoop()
// {
//     XInitThreads();

//     Display *display = XOpenDisplay(NULL);
//     // int screennum;
//     int width;
//     int height;

//     // const char *strdraw = "hello world";

//     // Window win;
//     // Window win2;
//     // //GC gc;
//     // //打开显示 没有指明打开哪个显示时使用环境变量中的DESPLAY
//     // display = XOpenDisplay(NULL);

//     if (!display)
//     {
//         printf("call XOpenDisplay(% s) fail / n", XDisplayName(NULL));
//         return;
//     }
//     width = 800;
//     height = 400;
//     auto win = X11CreateWindow(display, "hello x11", width, height, true);

//     auto win2 = X11CreateWindow(display, "smallwin", 400, 300, true);
//     auto win3 = X11CreateWindow(display, "smallwin", 400, 300, true);
//     bgfx::PlatformData pd;
//     pd.ndt = (void *)display;
//     pd.nwh = (void *)win;
//     pd.context = nullptr;
//     pd.backBuffer = nullptr;
//     pd.backBufferDS = nullptr;
//     bgfx::setPlatformData(pd);

//     bgfx::Init initopt;
//     initopt.type = bgfx::RendererType::Count;
//     initopt.vendorId = BGFX_PCI_ID_NONE;
//     // initopt.platformData.ndt = (void *)display;
//     // initopt.platformData.nwh = (void *)win;
//     initopt.resolution.width = width;
//     initopt.resolution.height = height;
//     initopt.resolution.reset = BGFX_RESET_VSYNC | BGFX_RESET_MSAA_X4;
//     bgfx::init(initopt);
//     bgfx::setDebug(BGFX_DEBUG_TEXT);

//     // 映射窗口 只有map后窗口才会在屏幕上显示
//     // show window
//     XMapWindow(display, win);
//     XMapWindow(display, win2);
//     XMapWindow(display, win3);
//     //auto buf1 = bgfx::createFrameBuffer((void *)win, width, height, bgfx::TextureFormat::RGBA8, bgfx::TextureFormat::D16);
//     //auto buf0 = bgfx::createFrameBuffer((void *)win, width, height, bgfx::TextureFormat::RGBA8, bgfx::TextureFormat::D16);
//     //auto buf1 = bgfx::createFrameBuffer((void *)win, width, height, bgfx::TextureFormat::RGBA8, bgfx::TextureFormat::D16);
//     auto buf2 = bgfx::createFrameBuffer((void *)win2, 400, 300, bgfx::TextureFormat::RGBA8, bgfx::TextureFormat::D16);
//     auto buf3 = bgfx::createFrameBuffer((void *)win3, 400, 300, bgfx::TextureFormat::RGBA8, bgfx::TextureFormat::D16);
//     //进入事件循环
//     // event loop
//     int curwidth = width;
//     int curheight = height;
//     bx::Thread thread;

//     while (1)
//     {
//         //有些事件是窗口相关的，有些不是
//         int eventcount = XPending(display);
//         if (eventcount == 0) 
//         {
//             bx::sleep(1);
//             //if (curwidth != width || curheight != height)
//             {
//                 bgfx::reset(width, height, BGFX_RESET_VSYNC | BGFX_RESET_MSAA_X4);
//                 curwidth = width;
//                 curheight = height;
//             }
//             bgfx::setViewMode(0, bgfx::ViewMode::Sequential);
//             bgfx::setViewFrameBuffer(0, BGFX_INVALID_HANDLE);
//             bgfx::setViewRect(0, 0, 0, width, height);
//             //底层跟踪glclear执行了
//             bgfx::setViewClear(0, BGFX_CLEAR_COLOR | BGFX_CLEAR_DEPTH | BGFX_CLEAR_STENCIL, 0x00bb33ff);
//             for(int y=0;y<100;y++)
//             bgfx::dbgTextPrintf(0,y,0xaa,"nihaononihaoniahoonihaoniahoonihaoniahoonihaoniahoihaoniaho");
//             bgfx::touch(0);

//             //bgfx配合x11和多窗口有问题，主窗口一直闪烁，似乎GLClear没有执行
//             bgfx::setViewFrameBuffer(1, buf2);
//             bgfx::setViewRect(1, 0, 0, 400, 300);
//             bgfx::setViewClear(1, BGFX_CLEAR_COLOR | BGFX_CLEAR_DEPTH, 0xaabbbbff);
//             bgfx::touch(1);

//             bgfx::setViewFrameBuffer(2, buf3);
//             bgfx::setViewRect(2, 0, 0, 400, 300);
//             bgfx::setViewClear(2, BGFX_CLEAR_COLOR | BGFX_CLEAR_DEPTH, 0xaa33bbff);

//             bgfx::touch(2);
//             bgfx::frame();
//             continue;
//         }

//         XEvent event;
//         XNextEvent(display, &event); // 读一个事件

//         switch (event.type)
//         {
//         case ClientMessage:
//         {
//             if (event.xclient.window == win)
//             {
//                 Atom a = (Atom)event.xclient.data.l[0];
//                 if (strcmp(XGetAtomName(display, a), "WM_DELETE_WINDOW") == 0)
//                 {
//                     return;
//                 }
//             }
//         }

//         break;
//         case Expose: // expose window 显示事件
//             if (event.xexpose.count != 0)
//                 break;
//             // XDrawString(display, win, gc, 10, 10,
//             //             strdraw, strlen(strdraw));
//             break;

//         // 按键事件
//         //case ButtonPress:
//         case KeyPress:
//             //XFreeGC(display, gc);
//             XDestroyWindow(display, win);
//             //XCloseWindow(win);
//             XCloseDisplay(display);
//             return;
//         case ConfigureNotify:

//             if (event.xconfigure.window == win)
//             {
//                 width = event.xconfigure.width;
//                 height = event.xconfigure.height;
//             }
//             break;
//         default:
//             break;
//         }
//     }
// }
// // void winmgr::MainLoop()
// // {
// //     SDL_Init(0);

// //     SDL_Window *winMain = SDL_CreateWindow("helloha", SDL_WINDOWPOS_UNDEFINED, SDL_WINDOWPOS_UNDEFINED, 800, 600, SDL_WINDOW_SHOWN | SDL_WINDOW_RESIZABLE);
// //     SDL_Window *win2 = SDL_CreateWindow("small", SDL_WINDOWPOS_UNDEFINED, SDL_WINDOWPOS_UNDEFINED, 300, 200, SDL_WINDOW_SHOWN | SDL_WINDOW_RESIZABLE);
// //     auto winid = SDL_GetWindowID(winMain);
// //     auto winid2 = SDL_GetWindowID(win2);
// //     SDL_SysWMinfo wmi;
// //     SDL_SysWMinfo wmi2;
// //     SDL_VERSION(&wmi.version);
// //     SDL_VERSION(&wmi2.version);
// //     if (!SDL_GetWindowWMInfo(winMain, &wmi))
// //     {
// //         return;
// //     }
// //     if (!SDL_GetWindowWMInfo(win2, &wmi2))
// //     {
// //         return;
// //     }
// //     bgfx::PlatformData pdata;
// //     if (wmi.subsystem == SDL_SYSWM_X11)
// //     {
// //         pdata.ndt = wmi.info.x11.display;
// //         pdata.nwh = (void *)wmi.info.x11.window;
// //     }
// //     else
// //     {
// //         throw "only support x11 fornow.";
// //     }
// //     //this->hwnd = (HWND)hwnd;
// //     //bgfx SetPlatformData ,��Ҫ�ǰ� hwnd (��windows��˵)

// //     // pdata.nwh = sdlNativeWindowHandle(win); //bind windows info
// //     bgfx::setPlatformData(pdata);

// //     bgfx::Init initopt;

// //     initopt.type = bgfx::RendererType::Enum::Count;
// //     initopt.resolution.reset = BGFX_RESET_VSYNC;
// //     int viewwidth = 0;
// //     int viewheight = 0;
// //     SDL_GetWindowSize(winMain, &viewwidth, &viewheight);
// //     initopt.resolution.width = viewwidth;
// //     initopt.resolution.height = viewheight;
// //     auto b = bgfx::init(initopt);

// //     bgfx::setDebug(BGFX_DEBUG_STATS);

// //     //init first

// //     auto caps = bgfx::getCaps();
// //     //TRACE("== bgfx::init = %s \n", b ? "true" : "false");

// //     bgfx_imgui::Init(nullptr,viewwidth,viewheight);
// //     //set clearcolor

// //     auto fb = bgfx::createFrameBuffer((void *)wmi2.info.x11.window, 300, 200, bgfx::TextureFormat::RGBA8, bgfx::TextureFormat::D16);
// //     //bgfx::reset(viewwidth, viewheight);
// //     SDL_Event event;
// //     bool bexit = false;

// //     //最后的输出需要一锅烩
// //     //sdl有点闪烁，不管了，随他去吧。
// //     //编辑器闪烁有可能和bgfx的多线程有关
// //     //RT 可以单独一帧画，
// //     while (!bexit)
// //     {
// //         int w, h;
// //         SDL_GetWindowSize(winMain, &w, &h);
// //         if (w != viewwidth || h != viewheight)
// //         {
// //             bgfx::reset(w, h, BGFX_RESET_VSYNC);
// //             viewwidth = w;
// //             viewheight = h;
// //         }
// //         //draw mainwindow
// //         bgfx::setViewFrameBuffer(0, BGFX_INVALID_HANDLE);
// //         bgfx::setViewMode(0, bgfx::ViewMode::Default);
// //         bgfx::setViewClear(0, BGFX_CLEAR_COLOR | BGFX_CLEAR_DEPTH, 0xFF33ddFF);
// //         bgfx::setViewRect(0, 0, 0, viewwidth, viewheight);
// //         bgfx::setViewScissor(0);
// //         bgfx::touch(0);
// //         //bgfx::frame();

// //         //draw smallwindow

// //         bgfx::setViewFrameBuffer(1, fb);
// //         bgfx::setViewClear(1, BGFX_CLEAR_COLOR | BGFX_CLEAR_DEPTH, 0xFF00FFFF);
// //         bgfx::setViewRect(1, 0, 0, 300, 200);
// //         bgfx::touch(1);
// //         bgfx::frame();

// //         SDL_PollEvent(&event);
// //         switch (event.type)
// //         {

// //         case SDL_QUIT:
// //             //m_eventQueue.postExitEvent();
// //             bexit = true;
// //             break;
// //         case SDL_WINDOWEVENT:
// //         {

// //             if (event.window.event == SDL_WINDOWEVENT_RESIZED ||
// //                 event.window.event == SDL_WINDOWEVENT_SIZE_CHANGED ||
// //                 event.window.event == SDL_WINDOWEVENT_MAXIMIZED ||
// //                 event.window.event == SDL_WINDOWEVENT_RESTORED)
// //             {
// //                 if (event.window.windowID == winid)
// //                 {
// //                     // int w, h;
// //                     // SDL_GetWindowSize(winMain, &w, &h);
// //                     // bgfx::reset(w, h,BGFX_RESET_VSYNC);
// //                     // viewwidth=w;
// //                     // viewheight =h;
// //                 }
// //             }
// //             if (event.window.event == SDL_WINDOWEVENT_CLOSE)
// //             {
// //                 if (event.window.windowID == winid)
// //                 {
// //                     SDL_DestroyWindow(winMain);
// //                     bexit = true;
// //                 }
// //                 else
// //                 {
// //                     SDL_DestroyWindow(win2);
// //                 }
// //             }
// //         }
// //         break;
// //         }
// //     }
// //     //exit
// //     //here
// // }
// void winmgr::CreateMainWin(const char *title, int w, int h, int nCmdShow, std::shared_ptr<IWin> winprocess)
// {
// }
// void winmgr::CreateWin(const char *title, int w, int h, std::shared_ptr<IWin> winprocess)
// {
// }
// void winmgr::ResetSubWin()
// {
// }

// //protected:
// int winmgr::GetFreeID()
// {
// }
// void winmgr::OnExitWin(void *hwnd)
// {
// }